home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok84 / pamehtapatch / pamehtapatch.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  118 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       PAMEHTAPatch
  3.   :Contents.      Get PAMEHTA (AMOK #27) working with 2.0 and up
  4.   :Author.        Kai Bolay [kai]
  5.   :Address.       Snail-Mail:              E-Mail:
  6.   :Address.       Hoffmannstraße 168       UUCP: kai@amokle.stgt.sub.org
  7.   :Address.       D-7250 Leonberg 1        FIDO: 2:2407/106.3
  8.   :History.       v1.0 [kai] 12-Jul-92 (derived from NTSC4NZTSC 1.9)
  9.   :History.       v1.1 [kai] 17-Dec-92 (Patch OpenWindow() not OpenScreen() !!)
  10.   :Copyright.     Freeware
  11.   :Language.      Oberon
  12.   :Translator.    AMIGA OBERON v3.0d
  13. ------------------------------------------------------------------------ *)
  14. MODULE PAMEHTAPatch; (* $Debug- *)
  15. (* $IF SmallData *) Not possible (* $END *)
  16.  
  17. (* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)
  18.  
  19. IMPORT
  20.   e: Exec, I: Intuition, g: Graphics, u: Utility, d: Dos, y: SYSTEM
  21.   (* $IF DoIt *) ,dio: DebugIo (* $END *);
  22.  
  23. CONST
  24.   OpenWindowOfs = -204;
  25.   (* $IF DoIt *)
  26.   Version = "$VER: PAMEHTAPatch v1.1 (17.12.92) by Kai Bolay (Debug)\r\n";
  27.   (* $ELSE *)
  28.   Version = "$VER: PAMEHTAPatch v1.1 (17.12.92) by Kai Bolay\r\n";
  29.   (* $END *)
  30. TYPE
  31.   OpenWindowProc = PROCEDURE (newWindow{8}: I.NewWindowPtr): I.WindowPtr;
  32. VAR
  33.   OldOpenWindow: OpenWindowProc;
  34.  
  35. PROCEDURE NewOpenWindow* (newWindow{8}: I.NewWindowPtr): I.WindowPtr;
  36. VAR
  37.   Base: I.IntuitionBasePtr;
  38.   type: SET;
  39.   winPtr: I.WindowPtr;
  40.  
  41. (* $SaveRegs+ $ClearVars- Prepare to work in other tasks *)
  42. BEGIN
  43.   Base := y.REG (14);
  44.   (* $IF DoIt *)
  45.   dio.WriteString ("OpenWindow()\n");
  46.   (* $END *)
  47.   (* Do the magic *)
  48.   type := newWindow.type;
  49.  
  50.   (* $IF DoIt *)
  51.   dio.WriteString ("NewWindow: "); dio.WriteHex (y.VAL (LONGINT, newWindow), 8);
  52.   dio.WriteLn;
  53.   dio.WriteString ("Type: "); dio.WriteHex (y.VAL (INTEGER, newWindow.type), 4);
  54.   (* $END *)
  55.  
  56.   IF (type * I.screenType # I.customScreen) AND
  57.      (type * I.screenType # SET {I.wbenchScreen}) AND
  58.      (type * I.screenType # SET {I.publicScreen}) THEN
  59.     newWindow.type := type + I.customScreen;
  60.   END;
  61.   (* $IF DoIt *)
  62.   dio.WriteString (" -> "); dio.WriteHex (y.VAL (INTEGER, newWindow.type), 4);
  63.   dio.WriteLn;
  64.   (* $END *)
  65.  
  66.   y.SETREG (14, Base);
  67.   winPtr := OldOpenWindow (newWindow);
  68.   (* $IF DoIt *)
  69.   dio.WriteString ("Open!\n\n");
  70.   (* $END *)
  71.   newWindow.type := type;
  72.   y.SETREG (14, Base);
  73.   RETURN winPtr;
  74. END NewOpenWindow;
  75.  
  76.  
  77. BEGIN
  78.   (* $IF DoIt *)
  79.   dio.OpenIo;
  80.   dio.WriteString ("Jappadappaduuu!\n");
  81.   (* $END *)
  82.   y.SETREG (0, d.Write (d.Output (), Version[6], y.SIZE (Version)-6));
  83.   (* 2.04 should be :-) *)
  84.   IF I.int.libNode.version < 37 THEN
  85.     IF d.Output () # NIL THEN
  86.       y.SETREG (0, d.Write (d.Output (), "Sorry, I need OS 2.04!\n", 23));
  87.     END;
  88.     HALT (20);
  89.   END;
  90.  
  91.   (* Patch *)
  92.   e.Forbid;
  93.   OldOpenWindow := y.VAL (OpenWindowProc,
  94.                           e.SetFunction (I.int, OpenWindowOfs,
  95.                                          y.VAL (e.PROC, NewOpenWindow)));
  96.   e.Permit;
  97.  
  98.   (* Wait for Break *)
  99.   y.SETREG (0, e.Wait (LONGSET {d.ctrlC})); (* ... *)
  100.  
  101.   (* Unpatch *)
  102.   e.Forbid;
  103.   OldOpenWindow := y.VAL (OpenWindowProc,
  104.                           e.SetFunction (I.int, OpenWindowOfs,
  105.                                          y.VAL (e.PROC, OldOpenWindow)));
  106.   e.Permit;
  107.   IF (y.VAL (y.ADDRESS, OldOpenWindow) # y.VAL (y.ADDRESS, NewOpenWindow)) THEN
  108.     IF I.DisplayAlert (I.recoveryAlert,
  109.                        "\x00\x10\x10Someone else patched too. Safety cannot be guarateed, please reboot!\o\n\x00\x10\x1A     -> Reboot <-                           -> Hope and pray <-     \o\o",
  110.                        40) THEN
  111.       e.ColdReboot;
  112.     END;
  113.   END;
  114.   (* $IF DoIt *)
  115.   dio.CloseIo;
  116.   (* $END *)
  117. END PAMEHTAPatch.
  118.